......

Creación de scripts para el mIRC
4º parte: Eventos

By Somatic
(sucubus@arrakis.es)
  1.- INTRODUCCIÓN

Se conocen como EVENTOS, en informática, todos aquellos sucesos que se producen a lo largo de una sesión de trabajo de un programa, y que éste es capaz de detectar y controlar.

La programación orientada a eventos es aquella en la que podemos definir previamente las acciones que el programa debe de emprender en el momento en que se produzca un evento concreto. Es decir, predisponemos al programa a que preste especial atención a algunos sucesos concretos, y le obligamos a que analice dichos eventos, a fin de determinar si se reúnen las circunstancias que hemos establecido, y de ser así, a ejecutar las acciones que para ese caso le hemos programado.

El mIRC es un programa altamente configurable y personalizable a través de la definición de Alias, Popups, y Remotes. Dentro de este último grupo provee una de sus herramientas más potentes: la posibilidad de programar acciones orientadas a un grupo de eventos propios de una sesión de IRC; es decir, es posible programar de modo sencillo acciones de cierta complejidad como respuesta a algunas situaciones.

2.- UN EJEMPLO DEL USO DE EVENTOS

Por ejemplo, es muy sencillo hacer que el programa detecte cada vez que, en cualquier canal en el que estemos, alguien escriba nuestro nick (supongamos que es SomaTic), y en consecuencia, si lo deseamos, comunicar privadamente a esa persona que no estamos prestando atención en ese momento. No habría más que recurrir al evento "onTEXT", quizás el más importante de todos.

Para esto debemos de ir al menú "TOOLS" que se encuentra en la barra de menús de la parte superior de la pantalla y pulsar la opción "REMOTE...". Nos aparece un cuadro con una gran ventana de texto y una nueva barra de menús en la parte superior. Vayamos al menú "VIEW" y seleccionemos la opción "events"; ya podemos escribir en el cuadro de texto nuestras órdenes para el control de eventos. Escribiremos la siguiente línea:

on 1:TEXT:Somatic:#:/notice $nick Perdona $nick no estoy prestando atención!!!.

Pulsamos el botón "OK" y trabajo concluido. Desde este momento, si {_PePe_} menciona el nombre de SomaTic recibirá un mensaje que solo podrá ver él en el que le decimos: "Perdona {_PePe_} no estoy prestando atención!!!".

Al margen de la sintaxis de la línea, que veremos más adelante, la objeción es evidente: ¿Y que pasa si SÍ estamos prestando atención? ¿tenemos que ir otra ver a la ventana de edición de eventos y borrar lo que pusimos?. Bueno, es una posibilidad, pero afortunadamente también tenemos la facilidad de hacer que la acción de los eventos que deseemos se active y desactive a nuestra voluntad. Vayamos de nuevo a la ventana de edición de eventos y escribamos lo siguiente el las líneas anterior y posterior a la que escribimos antes: #ausente off y #ausente end. El bloque total quedará de la siguiente forma:

#ausente off

on 1:TEXT:Somatic:#:/notice $nick Perdona $nick no estoy prestando atención!!!.

#ausente end

De esta forma podemos crear bloques de eventos con tantas líneas como deseemos en su interior. Para activar o desactivar su efecto debemos de incluir las instrucciones: .enable #ausente y .disable #ausente dentro de algún alias o de un menú (si esto le causa problemas ahora es el momento que estudiar a fondo las secciones de aliases y popups del mIRC ;)).

3.- GENERALIDADES DE LA SINTAXIS DE LOS EXENTOS

Como ya se ha podido observar en el ejemplo anterior, lo que hemos dado en llamar un la línea de evento se forma mediante una cadena de caracteres en la que los distintos campos de información están separados por el símbolo de los dos puntos. Los campos son los siguientes:

on <nivel>:<EVENTO>:<texto>:<lugar>:<comando/os>

En el primer campo es necesario especificar en nivel de acceso remoto que ese usuario tiene a nuestro sistema. Este es un tema algo complejo en el que no procede entrar ahora, baste saber que este nivel es un número que marca la capacidad de acceso que cada usuario tiene para ejecutar comandos del IRC de forma remota dentro de nuestro ordenador. No se alarme, nadie tendrá un nivel que usted no le haya concedido previamente, y este para los comandos que usted especifique. Para comprobar quien tiene nivel de acceso remoto a su sistema no tiene más que mirar en la solapa de "USERS" de la misma ventana desde donde introducimos los eventos, ahí puede añadir o borrar lo que desee. En principio, y para todos los efectos de este documento, podemos considerar el nivel de acceso 1 que es el que otorga el programa por defecto a todos lo usuarios; por tanto, en este caso el primer campo sería: on 1.

también es posible anteponer el símbolo @ antes del número de nivel, si hacemos esto, la definición del evento no se ejecutará nada más que en caso de que dispongamos del estatus de operador del canal.

El segundo campo es el identificador del evento que estamos configurando, en el ejemplo anterior era TEXT, pero descubrirá que hay otros muchos.

El tercer campo es el "texto", este no tiene sentido en todos los eventos, gran parte de ellos no están vinculados a texto alguno, y simplemente se omite este campo.

El cuarto campo es "lugar", es decir, el canal, privado...etc. donde el mIRC vigilará la circunstancia del evento, podemos especificar de este modo que determinado evento produzca las acciones especificadas solo si se da en un determinado lugar. Como en el campo anterior no siempre tiene sentido y por tanto se omite en algunas definiciones de eventos.

El último campo es el más grande, incluye el comando o comandos, alias, etc... que se ejecutarán en caso de que se produzca el evento y las circunstancias especificadas. En este campo se pueden concatenar varios comando utilizando el símbolo "entubador": "|" (no olvide dejar espacios en blanco a ambos lados del entubador).

Para aumentar aun más la potencia de la configuración de eventos, estos admiten el uso de funciones, son todos aquellos identificadores que comienzan por el símbolo $ (la referencia del mIRC los llama parámetros, el tema es mas bien terminológico, yo prefiero verlas como funciones puesto que junto con las internas del programa el mIRC permite definir otras propias, con una sintaxis muy similar a la del lenguaje C). No se relaciona en este documento una lista exhaustiva de dichas funciones, puesto que muchas de ellas son propias de un solo evento concreto, mientras que otros no las admiten. No obstante, si presta atención a los ejemplos irá viendo la forma y utilidad de la mayoría de ellas, en los lugares en los que son efectivas; el resto lo debe de aportar la experiencia personal. (las funciones deberán de tener siempre espacios en blanco a ambos lados de su nombre).

Es perfectamente posible, así mismo, el empleo de variables y estructuras dentro de las definiciones de eventos, pero el uso de las variables, estructuras y funciones del usuario debe de quedar, por mi parte, para otro documento cuando me anime a escribirlo ;-), entre tanto se puede consultar la ayuda en inglés del mIRC donde están explicadas bastante bien.

Es hora de entrar a conocer una a una las definiciones de eventos que proporciona la versión 5.02 del mIRC. Esta lista está basada en la ayuda del propio programa y no la considero cerrada, por tanto agradeceré cualquier crítica y sugerencia, por supuesto las dudas también serán atendidas en mi e-mail: sucubus@ arrakis.es, o en el canal #ayuda_irc del IRC Hispano, no tiene más que preguntar por SomaTic ;).

4.- LISTA DE REFERENCIA DE EVENTOS

on TEXT

Este evento se produce al recibir un mensaje especificado, bien en un privado, o bien en un canal activo.

Formato: on <level>:TEXT:<texto>:<*><?><#[,#]>:<comandos>

Ejemplo: on 1:TEXT:*ayuda*:#mirc,#irchelp:/msg $nick cual es el problema?

El texto del mensaje que deseamos que produzca el evento se puede especificar de varias maneras:

* El evento se producirá ante cualquier texto.
& El evento se producirá ante cualquier palabra.
palabra El evento se produce anta una palabra concreta y no otra.
texto* Se produce ante una cadena de caracteres que comience por el texto especificado.
*texto Se produce ante una cadena de caracteres que finalice por el texto especificado.
*cadena* El evento se produce si el texto contiene la cadena especificada, sea cual sea su posición.

Se puede especificar el lugar donde se controlará el evento de la siguiente forma:

?

Controlara la producción del evento dentro de un query o de un DCC chat

#

Controlara la producción del evento dentro de un canal cualquiera en el que nos encontremos

#<canal1>#<canal2>

Controlará la producción del evento dentro de un canal especificado.

*

Controla el evento en un privado o canal indistintamente.

Ejemplos:

on 1:TEXT:Hola*:#:/msg $chan Bienvenido al canal $chan $nick!

Esta instrucción detectará cuando alguien diga la palabra "Hola" en cualquier canal que nos encontremos, y automáticamente le dará la bienvenida al canal en cuestión.

on 1:ACTION:*set mode*:#:/msg $chan Ya estamos jugando con los modos ;D.

Esta orden detectará cualquier acción que contenga la cadena "Set mode", y emitirá un mensaje al canal en que se produce.

on 1:NOTICE:*:?:/msg $nick Estoy ocupado, espera un momento!

Esta orden detecta cualquier /notice recibido estando en un privado, y responde con otro /notice al autor, con otro mensaje.

También es posible emplear variables para dar más flexibilidad al formato del texto de la ubicación del evento:

on 1:TEXT:texto:%canal:/msg $nick Tú has escrito %matchtext en el canal: %channel

Este ejemplo trabajará con los valores previamente guardados en las variables %texto, y %canal.

Nota: Este evento se producirá solo ante textos de otros usuarios, los de usted no desencadenarán el evento.

on ACTION on NOTICE

Tienen exactamente el mismo formato que on TEXT, y se producen a partir de una acción o de una noticia respectivamente.

on BAN on UNBAN

Estos eventos se producirán cuando un usuario sea baneado o desbaneado en el canal.

Formato: on <level>:BAN:<#[,#]>:<comandos>

Ejemplos:

on 1:BAN:#mirc,#irchelp:/msg $nick Has sido baneado de: $chan

on 9:BAN:#newbies:/mode $chan -o $nick | /mode $chan -b $banmask

El segundo ejemplo es una acción múltiple que quita el estatus de operador al usuario que puso el ban, y elimina este cuando el usuario baneado tiene nivel 9 o superior en la lista de usuarios de nuestro programa (la función $banmask devuelve la máscara de baneo que fue empleada, y se usa, en este caso, para eliminar dicho baneo).

on 1:UNBAN:#:/msg $bnick Has sido desbaneado por $nick

Observe en este ejemplo el uso de la función $bnick. Esta devuelve el nick del usuario desbaneado, pero solo en caso de que dicho nick este incluido dentro de la máscara del baneo. En caso contrario $bnick=$null (nulo).

Es posible tener en cuenta en la sintaxis de la instrucción los niveles del baneador y del baneado. A este fin se puede preceder el número de l nivel de los signos: <,>,<=,=>,<>, ó =. Por ejemplo:

on >=2:BAN:#mIRC:/msg $chan $nick baneado $banmask (legal)

En esta situación, si el nivel del baneador es mayor o igual que el del usuario baneado, se comunica que este es un ban legal (como se podría comunicar cualquier otra cosa)

Recuerde, esta sintaxis compara los niveles de baneado y baneador, nunca que este tenga o no nivel superior o igual a 2.

Nota: Estos eventos solo operan cuando el server de IRC proporciona los nicks de baneador y baneado, y no su cuando da sus direcciones.

on CHAT on SERV

Los eventos on CHAT y on SERV se producen cuando es enviado un mensaje la una ventana de DCC chat, o a un Fserve respectivamente.

Formato: on <level>:<CHAT/SERV>:<texto>:<comandos>

Ejemplo: on 1:CHAT:*ayuda*:/msg $nick Cual es el problema?

La especificación del texto que producirá el evento se hace de la misma forma que en ON TEXT.

on CHATOPEN on CHATCLOSE

Estos eventos se producen al abrirse o cerrarse (respectivamente), una sesión de DCC chat.

Formato: on <level>:CHATOPEN:<comandos>

Ejemplo: on 1:CHATOPEN:/msg =$nick Bienvenido!

Lo mismo se puede decir para los eventos on SERVOPEN y on SERVCLOSE; aplicables en este caso a sesiones del Fserve.

Ejemplos:

on 1:CHATOPEN:/msg =$nick Hola, estoy contigo en un momento.

Esta instrucción envía una frase al DCC chat cuando este se abre por primera vez. El uso del signo "igual" delante de $nick es necesario para que el mensaje se dirija a la misma ventana del DCC chat, y no a una ventana privada aparte.

on 1:CHATCLOSE:/notice $nick fin de la discusión!

Esto se produce al cerrar la ventana del DCC chat.

on CONNECT on DISCONNECT

El evento on CONNECT se produce cuando mIRC conecta al server de IRC, después de visualizar el MOTD

Formato: on <level>:CONNECT:<comandos>

Ejemplo: on 1:CONNECT:/join #ayuda_irc

on DISCONNECT es otro evento con el mismo formato, que se produce al desconectarse del server.

Ejemplo:

on 1:CONNECT:/echo Conectado a $server a las $time Tu nick es: $nick

on CTCPREPLY

Se produce cuando otro usuario responde a una pregunta CTCP por parte de usted.

Formato: on <level>:CTCPREPLY:<texto>:<comandos>

Ejemplo: on 1:CTCPREPLY:VERSION*:/echo $nick está usando IRC cliente: $1-

Ver evento on TEXT para los formatos de texto aceptados.

Ejemplo:

on 1:CTCPREPLY:PING*:/echo $nick ha respondido al ping!

on OP on DEOP

Se producen cuando un usuario del canal es opeado o deopeado.

Formato: on <level>:OP:<#[,#]>:<comandos>

Ejemplo: on 1:OP:#ayuda_irc:/msg $nick No abuses del estatus!

El evento on SERVEROP es exactamente igual, y se produce cuando un usuario es opeado por el server.

Ejemplos:

on 9:OP:#:/mode $chan -o $opnick | /msg $nick no opees a esa persona!

En este ejemplo el evento se produce cuando es opeado un usuario de nivel de acceso 9.

$opnick devuelve el nick de la persona opeada o deopeada, y $nick el de la que lo opeó o deopeó.

on 1:DEOP:#ayuda_irc:/mode $chan +o $opnick

Con esta orden devolvemos el op a cualquier persona que sea deopeada en el canal #ayuda_irc.

Es posible tener en cuenta en la sintaxis de la instrucción los niveles del opeador y del opeado. A este fin se puede preceder el número de l nivel de los signos: <,>,<=,=>,<>, ó =. Por ejemplo:

on >=2:OP:#mIRC:/msg $chan $nick opeado (legal)

En esta situación, si el nivel del opeador es mayor o igual que el del usuario opeado, se comunica que este es un op legal (como se podría comunicar cualquier otra cosa)

Recuerde, esta sintaxis compara los niveles de opeado y opeador, nunca que este tenga o no nivel superior o igual a 2.

Nota: Estos eventos solo operan cuando el server de IRC proporciona los nicks de opeador y opeado, y no su cuando da sus direcciones.

on VOICE on DEVOICE

Se produce cuando un usuario recibe o es privado de voz en un canal moderado.

Formato: on <level>:VOICE:<#[,#]>:<comandos>

Ejemplo: on 1:VOICE:#mIRC,#newbies:/msg $vnick ya tienes voz en: $chan

Ejemplos:

on 9:VOICE:#:/mode $chan -v $vnick | /msg $nick No des voz o ese tío!

Esta orden se ejecuta cuando el que recibe voz tiene nivel 9 o superior.

on 1:DEVOICE:#mIRC:/mode $chan +v $vnick

Devuelve la voz al que se le quite en el canal.

Son aplicables también los prefijos de comparación de niveles descritos en on BAN y on OP.

on DNS

Se produce cuando hacemos un requerimiento DNS (comando /dns).

Formato: on <level>:DNS:<commandos>

Ejemplo: on 1:DNS:/notice $me resuelto: $raddress

Ejemplo:

on 1:DNS:/echo $nick ip address: $iaddress named address: $naddress resolved address: $raddress

on ERROR

Se produce cuando el server envía un mensaje de error, por ejemplo, en una desconexión.

Formato: on <level>:ERROR:<texto>:<commandos>

Ejemplo: on 1:ERROR:*server full*:/echo Has salido del server!

Ver el evento on TEXT para el formato del texto.

Ejemplos:

on 1:ERROR:*banned*:/echo Has sido baneado de este server!

on FILESENT on FILERCVD

Se producen al completarse un dcc send o un dcc get.

Formato: on <level>:FILESENT:<filename[,filename]>:<comandos>

Ejemplo: on 1:FILESENT:*.txt:/msg $nick ahí te mando: $filename !!

Los eventos on SENDFAIL y on GETFAIL se producen cuando un dcc send o un dcc get son fallidos.

Ejemplos:

on 1:FILESENT:*.txt,*.ini:/echo Enviado $filename a $nick $address

Se produce cuando enviamos un fichero .TXT o INI. $filename devuelve el nombre del fichero enviado.

on 1:FILERCVD:*.txt,*.ini:/echo Recibido $filename de $nick | /run notepad.exe $filename

Esta orden avisa cuando hemos recibido ficheros .TXT e .INI, y abre el bloc de notas para ver su contenido.

on 1:SENDFAIL:*.txt:/echo Ha fallado el envío de $filename a $nick!!

on INPUT

Se produce cuando introducimos texto en una caja de texto y pulsamos INTRO.

Formato: on <level>:INPUT:<commandos>

Ejemplo: on 1:INPUT:/echo Texto introducido: $1-

La función $1- devuelve en este caso toda la cadena de texto introducida.

on INVITE

Se produce cuando un usuario nos invita a un canal.

Formato: on <level>:INVITE:<#[,#]>:<comandos>

Ejemplo: on 1:INVITE:#mIRC:/join $chan

on JOIN on PART

Se producen al entrar o salir un usuario del canal.

Formato: on <level>:JOIN:<#[,#]>:<comandos>

Ejemplo: on 1:JOIN:#mirc,#irchelp:/msg $nick Hola!

on KICK

Se produce cuando un usuario es expulsado de un canal.

Formato: on <level>:KICK:<#[,#]>:<comandos>

Ejemplo: on 5:KICK:#:/invite $knick $chan | /msg $nick Hey, $knick ese es mi amigo!

Es aplicable también aquí la regla de comparación de niveles de los nicks descrita el los eventos on BAN y on OP.

on LOAD on START

Estos eventos se producen cuando un fichero de script es cargado o descargado.

Formato: on <level>:LOAD:<commandos>

Ejemplo: on 1:LOAD:/echo mIRC Script cargado!

on MIDIEND

Se produce cuando el mIRC termina la reproducción de un fichero MIDI..

Formato: on <level>:MIDIEND:<commandos>

Ejemplo: on 1:MIDIEND:/splay jazzy.mid

Este evento no tiene funciones asociadas. No se producirá si la reproducción se detiene a causa de una interrupción, solo lo hace cuando la reproducción es completada.

on MODE

Se produce cuando un usuario cambia los modos del canal (pero no los de usuario) .

Formato: on <level>:MODE:<#[,#]>:<comandos>

Ejemplo: on 1:MODE:#ayuda_IRC:/notice $me $nick Cambia modos de $chan a: $1-

on SERVERMODE es otro evento que se produce cuando los modos son cambiados por el servidor.

Ejemplo:

on @1:MODE:#:/notice $me $nick changed $chan mode to $1-

Esta instrucción se produce cuando alguien cambia los modos del canal teniendo nosotros también el estatus de operador.

on NICK

Se produce cuando un usuario cambia de nick dentro del canal.

Formato: on <level>:NICK:<commandos>

Ejemplo: on 1:NICK:/msg $nick Hi $newnick!

$nick recibe el nick antiguo; $newnick el nuevo.

on NOTIFY on UNOTIFY

Se producen al entrar o salir del IRC un usuario que se encuentra en nuestra lista de notificaciones.

Formato: on <level>:NOTIFY:<commandos>

Ejemplos: on 1:NOTIFY:/msg $nick Hola nick, ya te veo venir!!! :)

on 1:UNOTIFY:/notice $me $nick se va del IRC *sniff* :-(

on QUIT

Se produce cuando un usuario que está en nuestro canal sale del IRC.

Formato: on <level>:QUIT:<commandos>

Ejemplos: on 1:QUIT:/notice $me $nick sale del IRC con el mensaje: $1- on 1:QUIT:/msg $chan Bye-Bye to $nick *sniff*

on SNOTICE

Se produce cuando recibimos una noticia del server.

Formato: on <level>:SNOTICE:<texto>:<commandos>

Ejemplo: on 1:SNOTICE:*client connecting*:/halt

Para una explicación del formato del texto, ver el evento on TEXT.

Ejemplo:

on 1:SNOTICE:*split*:/splay hack.wav

Activa un fichero de sonido en caso de una noticia del server anunciando un split.

on TOPIC

Se produce cuando algún usuario cambia el tópico del canal.

Formato: on <level>:TOPIC:<#[,#]>:<comandos>

Ejemplo: on 1:TOPIC:#mIRC:/msg $chan Hmm, que tópico mas cutre!!!: $1-

La función $1- devuelve el texto del nuevo tópico.

on USERMODE

Se produce cuando cambiamos nuestros modos de usuario.

Formato: on <level>:USERMODE:<commandos>

Ejemplo: on 1:USERMODE:/echo nuevos modos: $1-

on WALLOPS

Se produce cuando recibimos un wallops message.

Formato: on <level>:WALLOPS:<texto>:<commandos>

Ejemplo: on 1:WALLOPS:*aviso*:/echo $nick mensaje de aviso a las: $time

Ver el evento on TEXT para una explicación de los posibles formatos del texto.